home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / SIMPDB.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-02  |  5KB  |  192 lines

  1. UNIT SimpDB;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Simple database object with automatic reuse   Last changed: 02.03.97  SA ║}
  4. {║ of deleted records                                                       ║}
  5. {║                                                                          ║}
  6. {║                         (C) Copyright 1989-97 by                         ║}
  7. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  8. {║                                                                          ║}
  9. {║ This source may not be given to anybody, without the written permission  ║}
  10. {║ from The Portal Team.                                                    ║}
  11. {╚══════════════════════════════════════════════════════════════════════════╝}
  12. {$I POPDEFS.INC}
  13.  
  14. INTERFACE
  15.  
  16. USES Use32, Dos,
  17.      PoPTypes, NetFile;
  18.  
  19. TYPE
  20.   PFirstRec = ^TFirstRec;
  21.   TFirstRec = RECORD
  22.     FirstDel : LongInt;   { Pointer to first deleted record or -1 if no       }
  23.                           { deleted records exist.                            }
  24.     RecSize  : Word;      { Record size - to reindex program and Open check.  }
  25.   END;
  26.  
  27.   PSimpDB = ^TSimpDB;
  28.   TSimpDB = OBJECT(TNetFile)
  29.     CONSTRUCTOR Open(CONST AFName: PathStr; ARecSize: Word; Create: Boolean);
  30.     DESTRUCTOR  Close; VIRTUAL;
  31.     PROCEDURE AddRec(VAR Buffer); VIRTUAL;
  32.     PROCEDURE DelRec(VAR Buffer; RecNum: LongInt);
  33.     FUNCTION  NextRec(VAR Buffer; K: Boolean): Boolean;
  34.     FUNCTION  PrevRec(VAR Buffer; K: Boolean): Boolean;
  35.   PRIVATE
  36.     FirstRec : PFirstRec;
  37.  
  38.     PROCEDURE GetFirstRec(K: Boolean);
  39.     PROCEDURE PutFirstRec;
  40.   END;
  41.  
  42.   PTitFile = ^TTitFile;
  43.   TTitFile = OBJECT(TSimpDB)
  44.     CONSTRUCTOR Open(Create: Boolean);
  45.     PROCEDURE AddRec(VAR Buffer); VIRTUAL;
  46.  
  47.     FUNCTION  FindFile(AFName: S12; VAR TitRec: TInboundFile): Boolean;
  48.     PROCEDURE RemoveFile(AFName: S12);
  49.   END;
  50.  
  51.  
  52. IMPLEMENTATION
  53.  
  54. USES OpString,
  55.      Globals, LogFile, Util;
  56.  
  57.   CONSTRUCTOR TSimpDB.Open(CONST AFName: PathStr; ARecSize: Word; Create: Boolean);
  58.   BEGIN
  59.     IF ARecSize<SizeOf(TFirstRec) THEN ARecSize:=SizeOf(TFirstRec);
  60.     IF NOT INHERITED Open(AFName, ARecSize, Create) THEN Fail;
  61.     GetMem(FirstRec, RecSize);
  62.     FillChar(FirstRec^, RecSize, 0);
  63.     FirstRec^.FirstDel:=-1;
  64.     FirstRec^.RecSize:=RecSize;
  65.     GetFirstRec(NoKeep);
  66.     IF RecSize<>FirstRec^.RecSize THEN
  67.     BEGIN
  68.       AddLog('!','Record size error in: '+FName);
  69.       Close;
  70.       Fail;
  71.     END;
  72.   END;
  73.  
  74.   DESTRUCTOR TSimpDB.Close;
  75.   BEGIN
  76.     FreeMem(FirstRec, FirstRec^.RecSize);
  77.     INHERITED Close;
  78.   END;
  79.  
  80.   PROCEDURE TSimpDB.AddRec(VAR Buffer);
  81.   VAR
  82.     RecNum : LongInt;
  83.     TmpBuf : Pointer;
  84.   BEGIN
  85.     GetFirstRec(Keep);
  86.     IF FirstRec^.FirstDel<>-1 THEN
  87.     BEGIN
  88.       GetMem(TmpBuf, FirstRec^.RecSize);
  89.       RecNum:=FirstRec^.FirstDel;
  90.       GetRec(TmpBuf^, RecNum, Keep, Wait);
  91.       FirstRec^.FirstDel:=LongInt(TmpBuf^);
  92.       FreeMem(TmpBuf, FirstRec^.RecSize);
  93.       PutFirstRec;
  94.     END ELSE
  95.     BEGIN
  96.       RecNum:=FileSize;
  97.       Unlock(0);
  98.     END;
  99.     LongInt(Buffer):=0;
  100.     PutRec(Buffer,RecNum);
  101.   END;
  102.  
  103.   PROCEDURE TSimpDB.DelRec(VAR Buffer; RecNum: LongInt);
  104.   BEGIN
  105.     GetFirstRec(Keep);
  106.     IF LongInt(Buffer)=0 THEN
  107.     BEGIN
  108.       LongInt(Buffer):=FirstRec^.FirstDel;
  109.       FirstRec^.FirstDel:=RecNum;
  110.       PutRec(Buffer, RecNum);
  111.     END ELSE
  112.       Unlock(RecNum);
  113.     PutFirstRec;
  114.   END;
  115.  
  116.   FUNCTION TSimpDB.NextRec(VAR Buffer; K: Boolean): Boolean;
  117.   BEGIN
  118.     LongInt(Buffer):=1;
  119.     IF FilePos=0 THEN Seek(1);
  120.     WHILE (LongInt(Buffer)<>0) AND NOT EoF DO
  121.     BEGIN
  122.       Read(Buffer, K, Wait);
  123.       IF (LongInt(Buffer)<>0) AND K THEN Unlock(FilePos-1);
  124.     END;
  125.     NextRec:=(LongInt(Buffer)=0);
  126.   END;
  127.  
  128.   FUNCTION TSimpDB.PrevRec(VAR Buffer; K: Boolean): Boolean;
  129.   BEGIN
  130.     PrevRec:=False;
  131. {???
  132.     LongInt(Buffer):=1;
  133.     WHILE LongInt(Buffer)<>0 AND FilePos(f)>0 DO
  134.     BEGIN
  135.       NetRead(f, Buffer, K, Wait);
  136.     END;
  137.     PrevRec:=(LongInt(Buffer)=0);
  138. }
  139.   END;
  140.  
  141.   PROCEDURE TSimpDB.GetFirstRec(K: Boolean);
  142.   BEGIN
  143.     IF FileSize=0 THEN PutFirstRec;
  144.     GetRec(FirstRec^, 0, K, True);
  145.   END;
  146.  
  147.   PROCEDURE TSimpDB.PutFirstRec;
  148.   BEGIN
  149.     PutRec(FirstRec^, 0);
  150.   END;
  151.  
  152. {=== TTitFile ===}
  153.  
  154.   CONSTRUCTOR TTitFile.Open(Create: Boolean);
  155.   BEGIN
  156.     IF NOT INHERITED Open(StartPath+PoPReceivedFiles, SizeOf(TInboundFile), Create) THEN Fail;
  157.   END;
  158.  
  159.   PROCEDURE TTitFile.AddRec(VAR Buffer);
  160.   BEGIN
  161.     TInboundFile(Buffer).FileName:=StUpCase(TInboundFile(Buffer).FileName);
  162.     INHERITED AddRec(Buffer);
  163.   END;
  164.  
  165.   FUNCTION TTitFile.FindFile(AFName: S12; VAR TitRec: TInboundFile): Boolean;
  166.   VAR
  167.     Found  : Boolean;
  168.   BEGIN
  169.     AFName:=StUpCase(JustName(AFName));
  170.     Found:=False;
  171.     Seek(1);
  172.     WHILE NOT Found AND NextRec(TitRec, Keep) DO
  173.       IF TitRec.FileName=AFName THEN Found:=True ELSE Unlock(FilePos-1);
  174.     IF Found THEN DelRec(TitRec, FilePos-1);
  175.     FindFile:=Found;
  176.   END;
  177.  
  178.   PROCEDURE TTitFile.RemoveFile(AFName: S12);
  179.   VAR
  180.     Found  : Boolean;
  181.     TitRec : TInboundFile;
  182.   BEGIN
  183.     AFName:=StUpCase(JustName(AFName));
  184.     Found:=False;
  185.     Seek(1);
  186.     WHILE NOT Found AND NextRec(TitRec, Keep) DO
  187.       IF TitRec.FileName=AFName THEN Found:=True ELSE Unlock(FilePos-1);
  188.     IF Found THEN DelRec(TitRec, FilePos-1);
  189.   END;
  190.  
  191. END.
  192.